home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / nasm095s.zip / RDOFF / RDF2BIN.C < prev    next >
C/C++ Source or Header  |  1997-07-27  |  3KB  |  126 lines

  1. /* rdf2bin: convert an RDOFF object file to flat binary */
  2.  
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6.  
  7. #include "rdfload.h"
  8. #include "rdoff.h"
  9. #include "nasmlib.h"
  10.  
  11. long origin = 0;
  12. int align = 16;
  13.  
  14. char *getfilename(char * pathname)
  15. {
  16.     char * lastslash = pathname - 1;
  17.     char * i = pathname;
  18.  
  19.     while ( *i ) {
  20.     if (*i == '/') lastslash = i;
  21.     i++;
  22.     }
  23.     return lastslash + 1;
  24. }
  25.  
  26. int main(int argc, char **argv)
  27. {
  28.     rdfmodule     * m;
  29.     int     tmp;
  30.     FILE     *of;
  31.     char     * padding;
  32.     int     codepad, datapad;
  33.  
  34.     if (argc < 2) {
  35.     puts("Usage: rdf2bin [-o relocation-origin] [-p segment-alignment] "
  36.          "input-file  output-file");
  37.     puts("       rdf2com [-p segment-alignment] input-file output-file");
  38.     return 1;
  39.     }
  40.  
  41.     if (! nasm_stricmp(getfilename(*argv),"rdf2com")) {
  42.     origin = 0x100;
  43.     }
  44.     argv++, argc--;
  45.  
  46.     while (argc > 2) {
  47.     if (! strcmp(*argv,"-o")) {
  48.         argv++, argc--;
  49.         origin = readnum(*argv, &tmp);
  50.         if (tmp) {
  51.         fprintf(stderr,"rdf2bin: invalid parameter: %s\n",*argv);
  52.         return 1;
  53.         }
  54.     } else if (! strcmp(*argv,"-p")) {
  55.         argv++, argc--;
  56.         align = readnum(*argv, &tmp);
  57.         if (tmp) {
  58.         fprintf(stderr,"rdf2bin: invalid parameter: %s\n",*argv);
  59.         return 1;
  60.         }
  61.     } else 
  62.         break;
  63.  
  64.     argv++, argc--;
  65.     }
  66.     if (argc < 2) {
  67.     puts("rdf2bin: required parameter missing");
  68.     return -1;
  69.     }
  70.     m = rdfload(*argv);
  71.  
  72.     if (! m)
  73.     {
  74.     rdfperror("rdf2bin",*argv);
  75.     return 1;
  76.     }
  77.     printf("relocating %s: origin=%lx, align=%d\n",*argv,origin,align);
  78.  
  79.     m->textrel = origin;
  80.     m->datarel = origin + m->f.code_len;
  81.     if (m->datarel % align != 0) {
  82.     codepad = align - (m->datarel % align);
  83.     m->datarel += codepad;
  84.     }
  85.     else
  86.     codepad = 0;
  87.  
  88.     m->bssrel = m->datarel + m->f.data_len;
  89.     if (m->bssrel % align != 0) {
  90.     datapad = align - (m->bssrel % align);
  91.     m->bssrel += datapad;
  92.     }
  93.     else
  94.     datapad = 0;
  95.  
  96.     printf("code: %08lx\ndata: %08lx\nbss:  %08lx\n",
  97.        m->textrel, m->datarel, m->bssrel);
  98.  
  99.     rdf_relocate(m);
  100.  
  101.     argv++;
  102.  
  103.     of = fopen(*argv,"wb");
  104.     if (!of) {
  105.     fprintf(stderr,"rdf2bin: could not open output file %s\n",*argv);
  106.     return 1;
  107.     }
  108.  
  109.     padding = malloc(align);
  110.     if (!padding) {
  111.     fprintf(stderr,"rdf2bin: out of memory\n");
  112.     return 1;
  113.     }
  114.  
  115.     if (fwrite(m->t,1,m->f.code_len,of) != m->f.code_len ||
  116.     fwrite(padding,1,codepad,of) != codepad ||
  117.     fwrite(m->d,1,m->f.data_len,of) != m->f.data_len) 
  118.     {
  119.     fprintf(stderr,"rdf2bin: error writing to %s\n", *argv);
  120.     return 1;
  121.     }
  122.  
  123.     fclose(of);
  124.     return 0;
  125. }
  126.